iT邦幫忙

2024 iThome 鐵人賽

DAY 12
1

第三天:作用域與閉包

作用域(Scope) 和 **閉包(Closures)**對編寫高效、可維護的 JavaScript 代碼至關重要。

1. 作用域(Scope)

作用域 是指在代碼中變量和函數的可訪問範圍。JavaScript 中的作用域主要分為以下兩種:

  • 全局作用域(Global Scope):在代碼的任何地方都可以訪問的變量。
  • 函數作用域(Function Scope):在函數內部聲明的變量只能在該函數內部訪問。

範例:

let globalVar = "全局變量";

function testScope() {
let localVar = "局部變量";
console.log(globalVar); // 可以訪問全局變量
console.log(localVar); // 可以訪問局部變量
}

testScope();
console.log(localVar); // 錯誤:無法訪問局部變量

在這個例子中,globalVar 是全局變量,能在任何地方訪問;而 localVar 是函數內的局部變量,僅在函數內可用。

2. 區塊作用域(Block Scope)

區塊作用域 是在 ES6 中引入的,通過 let 和 const 來定義。區塊作用域指的是變量只能在其定義的區塊內可見(例如 if、for 等代碼塊)。

範例:
if (true) {
let blockVar = "區塊變量";
console.log(blockVar); // 可以訪問區塊變量
}

console.log(blockVar); // 錯誤:無法訪問區塊變量

在這個例子中,blockVar 只能在 if 區塊內訪問,出了該區塊則無法訪問。

3. 閉包(Closures)

閉包 是指函數可以「記住」並訪問它的詞法作用域,即使該函數在其作用域之外執行。當一個內部函數被返回或傳遞出去後,依然能夠記住它被創建時的作用域。

範例:

function outer() {
let outerVar = "我是外部變量";

function inner() {
console.log(outerVar); // 可以訪問外部變量
}

return inner;
}

let innerFunction = outer();
innerFunction(); // 輸出 "我是外部變量"

在這個例子中,inner 函數被返回並賦值給 innerFunction,即使 outer 函數已經執行完畢,但 innerFunction 仍然能夠訪問 outerVar,這就是閉包的概念。

4. 閉包的應用場景

閉包經常用於保持狀態創建私有變量。例如,我們可以使用閉包來實現計數器功能:

範例:
function createCounter() {
let count = 0;

return function() {
count++;
return count;
};
}

let counter = createCounter();
console.log(counter()); // 輸出 1
console.log(counter()); // 輸出 2
console.log(counter()); // 輸出 3

在這個例子中,createCounter 返回了一個函數,該函數能夠訪問 count 變量,並且每次調用時 count 的值都會自增。這樣,閉包就能「記住」之前的狀態。


上一篇
函數的定義與使用
下一篇
箭頭函數與匿名函數
系列文
JavaScript 基礎:端開發的第一步13
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言